package co.com.desarrollo.pedidos.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import co.com.desarrollo.pedidos.dao.PedidoUsuarioDAO;
import co.com.desarrollo.pedidos.entities.PedidoUsuario;

@Repository("pedidoUsuarioDAO")
public class JpaPedidoUsuarioDAOImpl implements PedidoUsuarioDAO {

	@PersistenceContext
	private EntityManager entityManager;

	@Transactional(readOnly = true)
	public List<PedidoUsuario> findAll() {
		return entityManager.createQuery("from PedidoUsuario",PedidoUsuario.class).getResultList();
	}

	@Transactional(readOnly = true)
	public PedidoUsuario findById(long pedidoUsuarioId) {		
		return entityManager.find(PedidoUsuario.class, pedidoUsuarioId);
	}

	@Transactional
	public PedidoUsuario store(PedidoUsuario pedidoUsuario) {
		return entityManager.merge(pedidoUsuario);
	}

	@Transactional
	public void delete(long pedidoUsuarioId) {
		entityManager.createQuery("delete from DetallePedidoUsuario dpu where dpu.pedidoUsuario.idpedidoUsuario = "+pedidoUsuarioId).executeUpdate();
		entityManager.remove(entityManager.find(PedidoUsuario.class, pedidoUsuarioId));
	}

	@Transactional(readOnly = true)
	public PedidoUsuario findActivoByUsuarioPedidoGrupo(long usuarioId,
			long pedidoGrupoId) {
		try{
			return entityManager.createQuery("from PedidoUsuario pu where pu.pedidoGrupo.estadoPedido.idestadoPedido = '0' and pu.usuario.idusuario = '"+usuarioId+"' and pu.pedidoGrupo.idpedidoGrupo = '"+pedidoGrupoId+"'", PedidoUsuario.class).getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	@Transactional(readOnly = true)
	public List<PedidoUsuario> findByUsuarioPedidoGrupo(long usuarioId,
			long pedidoGrupoId) {
		return entityManager.createQuery("from PedidoUsuario pu where pu.usuario.idusuario = '"+usuarioId+"' and pu.pedidoGrupo.idpedidoGrupo = '"+pedidoGrupoId+"'", PedidoUsuario.class).getResultList();
	}

	@Transactional(readOnly = true)
	public List<PedidoUsuario> findPedidosUsuarioByPedidoGrupo(
			long pedidoGrupoId) {
		return entityManager.createQuery("from PedidoUsuario pu where pu.pedidoGrupo.idpedidoGrupo = '"+pedidoGrupoId+"'", PedidoUsuario.class).getResultList();
	}

	@Override
	public List<PedidoUsuario> findPedidosUsuarioByUsuario(long usuarioId) {
		return entityManager.createQuery("from PedidoUsuario pu where pu.usuario.idusuario = '"+usuarioId+"'", PedidoUsuario.class).getResultList();
	}

}
